#ifndef USER_H
#define USER_H

#include <string>
#include <unordered_map>
#include <vector>
#include <iostream>

#include "main.h"


class User 
{
private:
    

public:

    std::string username;// 用户名
    std::string password;// 密码
    std::unordered_map<std::string, int> gameScores;// 游戏分数
    User();                                                                       // 无参构造函数
    User(const std::string &uname, const std::string &pwd);                       // 有参构造函数
    
    std::string getUsername() const;                                              // 获取用户名
    std::string getPassword() const;                                              // 获取密码
    const std::unordered_map<std::string, int> &getGameScores() const;            // 获取游戏分数
    
    bool verifyPassword(const std::string &pwd) const;                            // 验证密码
    bool changePassword(const std::string &oldPwd, const std::string &newPwd);    // 修改密码
    void displayAllScores() const;                                                // 显示所有分数
    
    std::string serialize() const;                                                // 序列化用户信息
    static User deserialize(const std::vector<std::string>& lines, size_t& index);// 反序列化用户信息
};

class UserManager 
{
private:
    static UserManager instance; // 静态单例实例
    UserManager();  // 构造函数
    UserManager(const UserManager&) = delete;
    UserManager& operator=(const UserManager&) = delete;

    std::vector<User> users;
    const std::string filename = "users.dat";

public:
    /**
     * @brief 获取 UserManager 类的单例实例
     *
     * 通过此方法可以获取 UserManager 类的唯一实例。
     *
     * @return 返回 UserManager 类的单例实例
     */
    static UserManager& getInstance() 
    {
        static UserManager instance;
        return instance;
    }                                                                            
    ~UserManager();                                                                             // 析构函数

    void saveUsers();                                                                           // 保存用户信息到文件
    void loadUsers();                                                                           // 从文件中加载用户信息
    
    bool createUser(const std::string &username, const std::string &password);                  // 创建用户
    User *authenticate(const std::string &username, const std::string &password);               // 用户认证
    const std::vector<User> &getAllUsers() const;                                               // 获取所有用户信息
    
    void displayLeaderboard(const std::string& gameName, int topN = 5);                        // 显示排行榜
    void updateUserScore(const std::string &username, const std::string &gameName, int score);  // 更新用户分数
    int getUserHighScore(const std::string &username, const std::string &gameName) const;       // 获取用户分数
};

#endif // USER_H
